package org.mch.func.m_px.yunsf;

/**
 * 描述：二进制原码、反码、补码工具类；<BR/>
 * 
 * @author MCH；Date：2008-06-18；<BR/>
 *
 */
public class ToolBinaryFBY {

	public String tool_YiHuoIaAndIb(String ia, String ib) {
		StringBuilder sb = new StringBuilder();
		for (int i = 0, len = ia.length(); i < len; i++) {
			if (ia.charAt(i) == ib.charAt(i)) {
				sb.append('0');
			} else {
				sb.append('1');
			}
		}
		return sb.toString();
	}

	/**
	 * 补齐前面少的 0
	 * 
	 * @param s
	 * @return
	 */
	public String setMinssBinaryZero(String s) {
		StringBuilder sb = new StringBuilder(s);
		for (int i = s.length(); i < 32; i++) {
			sb.insert(0, "0");
		}
		return sb.toString();
	}

	/**
	 * 将二进制字符串进行取反，就是0变1，1变为0；
	 * 
	 * @param s
	 * @return
	 */
	public StringBuilder tool_ZeroToOneOneToZero(String s) {
		StringBuilder sb_fan = new StringBuilder();
		for (int i = 0, len = s.length(); i < len; i++) {
			char c = s.charAt(i);
			if (c == '1') {
				sb_fan.append('0');
			} else {
				sb_fan.append('1');
			}
		}
		return sb_fan;
	}

	/**
	 * 根据【原码】二进制字符串，获得【反码】二进制字符串；
	 * 
	 * @param ym_bi
	 * @return
	 */
	public String byYuanMaToFanMa(String ym_bi) {
		if (ym_bi.charAt(0) == '0') {
			// 如果首位为 0 ，则为正数，即正数的原码=反码=补码；
			return ym_bi;
		} else {
			// 负数的反码是在其原码的基础上, 符号位不变，其余各个位取反
			StringBuilder sb = tool_ZeroToOneOneToZero(ym_bi.substring(1, ym_bi.length()));
			sb.insert(0, ym_bi.charAt(0));
			return sb.toString();
		}
	}

	/**
	 * 根据【反码】二进制字符串，获得【原码】二进制字符串；
	 * 
	 * @param fm_bi
	 * @return
	 */
	public String byFanMaToYuanMa(String fm_bi) {
		if (fm_bi.charAt(0) == '0') {
			// 如果首位为 0 ，则为正数，即正数的原码=反码=补码；
			return fm_bi;
		} else {
			// 负数的反码是在其原码的基础上, 符号位不变，其余各个位取反
			// 那么负数中，根据反码获得原码，也只取反，符号位不变即可
			StringBuilder sb = tool_ZeroToOneOneToZero(fm_bi.substring(1, fm_bi.length()));
			sb.insert(0, fm_bi.charAt(0));
			return sb.toString();
		}
	}

	/**
	 * 根据【反码】二进制字符串，获得【补码】二进制字符串；
	 * 
	 * @param fm_bi
	 * @return
	 */
	public String byFanMaToBuMa(String fm_bi) {
		if (fm_bi.charAt(0) == '0') {
			// 如果首位为 0 ，则为正数，即正数的原码=反码=补码；
			return fm_bi;
		} else {
			// 负数的补码是：反码+1. (即在反码的基础上+1)
			StringBuilder ssb = new StringBuilder();
			for (int i = fm_bi.length() - 1; i > 0; i--) {
				if (fm_bi.charAt(i) == '0') {
					ssb.insert(0, '1');
					ssb.insert(0, fm_bi.substring(0, i));
					break;
				} else {
					ssb.insert(0, '0');
				}
			}
			return ssb.toString();
		}
	}

	/**
	 * 根据【补码】二进制字符串，获得【反码】二进制字符串；
	 * 
	 * @param fm_bi
	 * @return
	 */
	public String byBuMaToFanMa(String bm_bi) {
		if (bm_bi.charAt(0) == '0') {
			// 如果首位为 0 ，则为正数，即正数的原码=反码=补码；
			return bm_bi;
		} else {
			// 负数的补码是：反码+1. (即在反码的基础上+1)
			// 那么，根据补码得反码，即反码=补码 - 1
			StringBuilder ssb = new StringBuilder();
			for (int i = bm_bi.length() - 1; i > 0; i--) {
				if (bm_bi.charAt(i) == '1') {
					ssb.insert(0, '0');
					ssb.insert(0, bm_bi.substring(0, i));
					break;
				} else {
					ssb.insert(0, '1');
				}
			}
			return ssb.toString();
		}
	}

	/**
	 * 左移，移一位
	 * 
	 * @param wys
	 * @return
	 */
	public String toLeftMoveOneBit(String wys) {
		return wys.substring(1, 32) + "0";
	}

	/**
	 * 右移，移一位
	 * 
	 * @param wys
	 * @return
	 */
	public String toRightMoveOneBit(String wys) {
		return wys.substring(0, 1) + "0" + wys.substring(1, 31);
	}

	/**
	 * 无符号右移，移一位
	 * 
	 * @param wys
	 * @return
	 */
	public String toWfhRightMoveOneBit(String wys) {
		return "0" + wys.substring(0, 31);
	}
}
